当前位置:运维

原文作者:xhuacmer


 一、总体结构

本文旨在分析在X86体系结构下CentOS 7 ISO镜像安装CentOS的过程,从ISO镜像boot起来到安装程序anacoda被启动起来进行软件包的安装。Linux CentOS ISO镜像安装系统的Boot过程和系统安装好后的boot过程在主体流程是一致的,只是用的bootloader有差异。目前ISO镜像安装盘使用的isolinux作为其bootloader,而正常的CentOS系统启动现阶段主流的bootloader一般是Grub2。ISO镜像安装的boot主要过程如下图1所示,这其中涉及到硬件POST自检、BIOS、磁盘分区、主引导记录MBR等前置知识点1。本文不会详细描述这部分的细节,只会在具体的流程中描述它起了什么作用。

 

 

图1

 

既然是分析CentOS ISO镜像的boot过程,我们先展示CentOS ISO镜像目录结构内容如图2所示,这里阐述一下涉及到boot过程的几个重要目录。

 

isolinux  目录主要存放光盘启动时的加载kernel的bootloader isolinux.bin以及其配置文件isolinux.cfg,kernel文件vmlinuz,虚拟文件系统initrd.img。

images   目录包括了PXE启动时必要的启动映像文件。

Packages 目录存放需要安装到系统上的rpm软件包及信息。

Repodata 目录存放rpm包依赖信息。

LiveOS   目录存放了一个重要只读文件系统squashfs.img镜像,安装程序anaconda就放在镜像中。

EFI      目录存放的EFI引导模式下所需的引导文件,如BOOTX64.EFI、grubx64.efi。

 

 

       

 

                                                      图2

 

二、详细分析

现在准备工作基本完毕,我们结合图1的流程图来逐一分析安装启动过程,并与CentOS ISO镜像目录结构内容中进行匹配。

 

2.1 系统固件初始化

现在x86架构上要想启动整个操作系统首先就要让机器加载 BIOS (Basic Input Output System),BIOS用于计算机硬件自检、CMOS设置、引导操作系统启动、提供硬件I/O、硬件中断等4项主要功能,因此BIOS程序可以分为若干模块,主要有Boot Block引导模块、CMOS设置模块、扩展配置数据(ESCD)模块、DMI收集硬件数据模块,其中引导模块直接负责执行BIOS程序本身入口、计算机基本硬件的检测和初始化,ESCD用于BIOS与OS交换硬件配置数据,DMI则充当了硬件管理工具和系统层之间接口的角色,通过DMI,用户可以直观地获得硬件的任何信息,CMOS设置模块就是实现对硬件信息进行设置,并保存在CMOS中,是除了启动初始化以外BIOS程序最常用的功能。

 

BIOS会根据CMOS中用户指定的硬件启动顺序,读取相应设备的启动或引导记录,引导相应设备上的操作系统启动,进入操作系统,此后便由操作系统接替BIOS负责硬件和软件间的相互通信。如果发现所有硬件都没有能引导操作系统的记录,则会在屏幕上显示相应错误信息,并将电脑维持在16位实模式。

 

2.2 加载bootloader

如2.1所描述,BIOS会读取MBR中存放的bootloader,即图3所示的isolinux目录下的isolinux.cfg文件,isolinux.cfg会协助进一步加载isolinux.bin。isolinux.bin会根据isolinux.cfg配置文件内容显示相应的boot菜单选择进行kernel的加载。

 

 

                                             图 3

 

2.3 加载kernel与initrd

isolinux.bin完成加载后,会根据用户在boot menu中的选择进行对应kernel的加载。Kenel自身是一个压缩文件,但是在kernel文件头部嵌入有解压的代码。Kernel就会将自己解压缩到主存储器当中, 并且利用内核的功能,开始测试与驱动各个周边装置,包括储存装置、CPU、网卡、声卡等等。 此时内核会以自己的功能重新侦测一次硬件,但是不一定会使用 BIOS 侦测到的硬件信息,此时内核才开始接管 BIOS 后的工作了。

 

同时bootloader会加载initrd虚拟文件系统,虚拟文件系统 (Initial RAM Disk 或 Initial RAM Filesystem) 一般使用的文件名为initrd.img或 initramfs_xxx.img ,这个文件能够通过 Boot Loader 来加载到内存中,然后这个文件会被解压缩且在内存当中仿真成一个根目录, 这个仿真目录在内存当中的文件系统能够提供一个可执行的程序,通过该程序来加载开机过程中所最需要的核心模块, 通常这些模块就是USB, RAID, LVM, SCSI等文件系统与磁盘接口的驱动程序。等到载入完成后,会帮助Kernel重新呼叫systemd来开始后续的正常开机流程。这里为什么需要initrd虚拟文件系统,需要补充这方面的知识。此步骤所需的Linux kernel文件与initrd.img文件如图3所示。

 

Initrd.img在内存中解压后的目录结构如图4所示,这和Linux所需的根文件系统结构基本保持一致。需要注意的是 initrd.img并没有囊括了所有东西,它仅仅包含了是开机过程会用到的核心模块而已。所以如果在initrd.img里面去找modules这个关键词的话,就可以发现主要的核心模块大概就是 SCSI、virtio、RAID等等跟磁盘相关性比较高的模块。现在由于磁盘大部分都是使用SATA,并没有IDE的格式了,所以没有initrd.img就无法顺利启动Linux系统,除非是将SATA的模块直接编译到内核。

                                                     图4

 

2.4 系统初始化

Kernel所需的基础运行环境到此已经准备就绪,Kernel会调用虚拟根文件系统中的init程序进行系统初始化。对于CentOS 7以上版本,init程序已经不是传统linuxrc脚本,而是Systemd,如图5所示。

 

 

                                                                                                                            图 5

 

 Systemd调用起来默认执行default.target,对于本文所描述的场景是执行initrd.target,如图6所示,initrd.target的部分依赖关系如图7所示。

 

                                                                                                                          图 6

 

                                                                                                                         图 7

 

initrd.target是需要读入一堆例如 basic.target, sysinit.target等等的硬件侦测、核心功能启用的流程,然后开始让系统顺利运作。最终才又卸除 initramfs 的小型文件系统,然后去挂载系统实际的根目录。

 

2.5 挂载squashfs.img

Squashfs.img镜像为一个只读压缩文件系统,在上述2.4步骤完成后,squashfs.img会挂载作为CentOS安装过程的根文件系统,形成一个特殊的安装环境。存储与其中的Systemd会被重新唤醒进行相应的target,如graphical.target,启动图形界面安装界面。

 

                                                                                                                                     图 8

 

2.6 启动anaconda

Anaconda启动后就会进行系统相关RPM包的安装。Anaconda安装程序的启动是有systemd执行anaconda.target的结果,anaconda.target被执行的依赖关系如下图所示。

 

                                                                                                                                 图9

                                                                                               图10

 

anaconda 在进行操作系统安装时会经由如下几个步骤:

 

安装前配置阶段,主要是设置一些参数。

安装过程使用的语言;

键盘类型

安装目标存储设备

Basic Storage:本地磁盘

Special Storage: iSCSI

设定主机名

配置网络接口

时区

管理员密码

设定分区方式及MBR的安装位置;

创建一个普通用户;

选定要安装的程序包;

安装前配置阶段有两种参数设置方式,一是安装交互式配置方式,利用 anaconda 提供的安装界面,逐项进行选择配置;二是通过读取配置文件中,事先定义好的配置项,自动完成配置;此文件即为kickstart文件。

 

安装阶段

在目标磁盘创建分区并执行格式化;

将选定的程序包安装至目标位置;

安装bootloader;

Reboot首次启动

iptables

selinux

core dump

 

参考文献

[1].https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/anaconda_customization_guide/sect-iso-images

[2].https://docs.centos.org/en-US/8-docs/standard-install/assembly_preparing-for-your-installation/

[3].https://www.cnblogs.com/simpman/archive/2013/05/29/3105550.html

[4].https://www.freedesktop.org/software/systemd/man/

————————————————

版权声明:本文为CSDN博主「xhuacmer」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/xhuacmer/article/details/109805719

评论
一些有趣的事儿